home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok70.lha / IFFSupport1.7 / IFFSupport.dok next >
Text File  |  1993-08-15  |  10KB  |  314 lines

  1.  
  2. =============================================================================
  3.  
  4.                     =   =   =   IFFSupport   =   =   =
  5.  
  6.                            © Copyright 1991 by
  7.                              Fridtjof Siebert
  8.                                Nobileweg 67
  9.                             7000 Stuttgart 40
  10.  
  11. =============================================================================
  12.  
  13.  
  14. Mit den von IFFSupport exportierten Prozeduren können IFFBilder geladen,
  15. gespeichert und Colorcycling-Bilder gezeigt werden.
  16.  
  17. Anders als bei anderen IFF-Unterstützungsroutinen (Ich habe die des
  18. TDI-M2-Compilers angesehen) werden hier die geladenen Daten in bekannten
  19. Formaten (Screens, Windows und BitMaps) und nicht so, wie sie im IFF-File
  20. vorliegen, übergeben. Dadurch vereinfacht sich die Handhabung.
  21.  
  22.  
  23. ------  Dieses Paket umfaßt folgende Dateien:  ------
  24.  
  25.  
  26.   IFFSupport.dok       : Diese Datei.
  27.  
  28.   txt/IFFSupport.mod   : Der Oberon-Quelltext
  29.   txt/LoadBody.asm     : Der Assembler-Quelltext der Maschinenroutine.
  30.   sym/IFFSupport.sym   : Symbol-Datei.
  31.   obj/IFFSupport.obj[s]: Objektdateien (mit Assemblerteil gejoint)
  32.   obj/LoadBody.o       : Der assemblierte Assemblerquelltext. Muß evtl.
  33.                          beim linken angegeben werden ('OBJ LoadBody.o')
  34.  
  35.  
  36.   ShowIFF              : ILBM-Ladeprogramm.
  37.   txt/ShowIFF.mod      : sein Quelltext.
  38.   ShowCycle            : ILBM-Lader für Colorcycling-Bilder.
  39.   txt/ShowCycle.mod    : Quellcode.
  40.  
  41.  
  42. ------------------------  Variablen & Typen:  -----------------------------
  43.  
  44.  
  45. Von IFFSupport werden folgende Variablen und Typen exportiert:
  46.  
  47. TYPE
  48.   IFFInfoTypePtr = POINTER TO IFFInfoType;
  49.   IFFInfoType = RECORD
  50.                   ...   (* Mega-Record *)
  51.                 END;
  52.  
  53. VAR
  54.   IFFInfo: IFFInfoType;
  55.  
  56. IFFInfo enthält Informationen über das zuletzt geladenen Bild oder
  57. Informationen über ein zu speicherndes Bild. Wenn mehrere Bilder verwendet
  58. werden, müssen eigene Variablen vom Typ IFFInfoType definiert werden, da
  59. bei jedem neuen Laden IFFInfo überschrieben wird.
  60.  
  61.  
  62. ------
  63.  
  64.  
  65. VAR
  66.   NuScreen: NewScreen;
  67.   NuWindow: NewWindow;
  68.  
  69. Können importiert werden, um später einen Screen mit der Grafik oder ein
  70. Window in dem Screen zu öffnen. siehe auch ReadILBM();
  71.  
  72.  
  73. ------
  74.  
  75.  
  76. TYPE
  77.   IFFErrors = SHORTINT;
  78.  
  79. CONST
  80.   iffNoErr             * = 0;
  81.   iffOutofMem          * = 1;
  82.   iffOpenScreenfailed  * = 2;
  83.   iffOpenWindowfailed  * = 3;
  84.   iffOpenfailed        * = 4;
  85.   iffWrongIFF          * = 5;
  86.   iffReadWritefailed   * = 6;
  87.  
  88. VAR
  89.   IFFError: IFFErrors;
  90.  
  91. IFFErrors enthält die Fehlerart, wenn das Laden oder Speichern eines Bildes
  92. erfolglos war.
  93.  
  94. iffNoErr:            Kein Fehler
  95. iffOutofMem:         Nicht genügend Speicher
  96. iffOpenScreenfailed: OpenScreen ist fehlgeschlagen
  97. iffOpenWindowfailed: Es konnte kein Fenster geöffnet werden
  98. iffOpenfailed:       File konnte nicht geöffnet werden
  99. iffWrongIFF:         Kein IFF-File
  100. iffReadWritefailed:  Schreib/LeseFehler
  101.  
  102.  
  103. ---------------------------  Prozeduren:  ---------------------------------
  104.  
  105.  
  106. ------  Laden von IFF-Bildern:  ------
  107.  
  108.  
  109. CONST
  110. (*  ReadILBMFlags: *)
  111.   front    * = 0;
  112.   visible  * = 1;
  113.   dontopen * = 2;
  114.   window   * = 3;
  115.  
  116. TYPE
  117.   ReadILBMFlagSet * = SET;
  118.  
  119. PROCEDURE ReadILBM(name: ARRAY OF CHAR; Flags: ReadILBMFlagSet;
  120.                    VAR Screen: I.ScreenPtr; VAR Window: I.WindowPtr): BOOLEAN;
  121.  
  122. ReadILBM lädt ein IFFBild mit dem Namen name. Trat ein Fehler auf, wird
  123. FALSE zurückgegeben.
  124. Folgende Flags können gewählt werden:
  125.  
  126.   - front:    Wenn gesetzt, wird der Screen, in den die Grafik geladen
  127.               wird, vor allen anderen Screens geöffnet, sonst dahinter.
  128.  
  129.   - visible:  Wenn visible nicht gesetzt ist, wird während dem Laden das
  130.               Display mit GfxMacros.OffDisplay() ausgeschaltet. Das erhöht
  131.               die Ladegeschwindigkeit, besonders bei Bildern mit hoher
  132.               Auflösung und/oder vielen Farben.
  133.  
  134.   - dontopen: Wenn gesetzt wird kein Screen geöffnet. Der zurückgegebene
  135.               ScreenPtr ist dann NIL. Die Grafik wird in eine BitMap
  136.               geladen. Der Zeiger auf die BitMap steht in
  137.               IFFSupport.NuScreen.customBitMap. Der Screen kann später mit
  138.               OpenScreen geöffnet werden. Bei gewähltem dontopen muß der
  139.               Speicher für die BitPlanes und die BitMap-Struktur später
  140.               wieder freigegeben werden.
  141.  
  142.   - window:   Wenn gesetzt wird vor dem Laden der GrafikDaten in den Screen
  143.               ein Fenster mit der Größe der Grafik geöffnet. Dadurch können
  144.               später Gadgets, Menüs etc. hinzugefügt werden, ohne die
  145.               Grafik zu zerstören. Ist window gelöscht, ist der WindowPtr
  146.               NIL.
  147.  
  148. Die Laderoutine unterstützt alle Auflösungen: Lores, Hires, Interlace, Hold
  149. and Modify, ExtraHalfBrite. Gepackte Bilder werden entpackt. Da der
  150. Entpacker in Maschinensprache geschrieben ist, werden gepackte Bilder
  151. schneller geladen als ungepackte.
  152.  
  153.  
  154. ------  ColorCycling:  ------
  155.  
  156.  
  157. PROCEDURE DoCycle(Info: IFFInfoTypePtr; Screen: I.ScreenPtr): BOOLEAN;
  158.  
  159. PROCEDURE EndCycle(Info: IFFInfoTypePtr);
  160.  
  161. Mit DoCycle kann das ColorCycling für eine Grafik eingeschaltet werden.
  162. Dazu wird ein VBlank-Interrupt initialisiert. Das Cycling läuft also im
  163. Hintergrund des eigenen Programms.
  164.  
  165. DoCycle benötigt einen ScreenPtr und die Addresse einer IFFInfoType-
  166. Variablen. Werden mehrere Bilder gleichzeitig mit ColorCycling gezeigt,
  167. müssen auch verschieden Variablen verwendet werden ! DoCycle() gibt FALSE
  168. zurück, wenn ein Fehler auftrat, d.h. mehr als 32 ColorCycling-Bilder
  169. gleichzeitig eingeschaltet sind. Da dies gewöhnlich nicht der Fall ist,
  170. kann DoCycle mit `IF DoCycle(ADR(IFFInfo),Screen) THEN END;' aufgerufen
  171. werden.
  172.  
  173. EndCycle() stoppt das ColorCycling wieder. Dazu wird der gleiche
  174. IFFInfoTypePtr benötigt wie bei DoCycle. EndCycle darf nicht vergessen
  175. werden, da die Interrupts sonst von IFFSupport nicht entfernt werden. Also
  176. spätenstens in der TermProcedure kurz vor dem Schließen des Screens
  177. aufrufen !!! Ich hätte die Interrupts auch in der Termprocedure von
  178. IFFSupport ausschalten können, doch gäbe es dann sicher Leute, die sich
  179. darauf verlassen würden und in ihrer Termprocedure lediglich den Screen
  180. schließen und das Cycling nicht ausschalten. Dies hätte zur Folge, daß die
  181. Farben eine kurze Zeit auf einem nicht mehr vorhandenen Screen cyclen, es
  182. gäbe also höchstwahrscheinlich einen Guru.
  183.  
  184.  
  185. ------  Speichern von IFF-Bildern:  ------
  186.  
  187.  
  188. Zum Speichern gibt es 3 ähnliche Prozeduren:
  189.  
  190.  
  191. PROCEDURE WriteILBMScreen(Name: ARRAY OF CHAR;
  192.                           Screen: I.ScreenPtr;
  193.                           Rect: g.RectanglePtr;
  194.                           CompressIt: BOOLEAN): BOOLEAN;
  195.  
  196. Speichert den Screen `Screen' mit dem Namen `Name'. Trat ein Fehler
  197. (iffOpenfailed oder iffReadWritefailed) auf, wird FALSE zurückgegeben.
  198. Ist CompressIt TRUE, wird ein gepacktes File erzeugt.
  199.  
  200. Rect kann, wenn der ganze Screen gespeichert werden soll, NIL sein. Sonst
  201. enthält es einen Zeiger auf ein Graphics.Rectangle. Rect^.minX/minY ist
  202. dann die linke obere und Rect^.maxX/maxY die rechte untere Ecke des
  203. Ausschnitts. Dabei sollte man Ausschnitte größer als der Screen oder
  204. ähnliche Späße vermeiden. Rect^.minX und Rect^.maxX brauchen keine
  205. Vielfachen von 16 sein. Sind sie es wird jedoch schneller gespeichert.
  206.  
  207.  
  208. ------
  209.  
  210.  
  211. PROCEDURE WriteILBM(Name: ARRAY OF CHAR;
  212.                     RP: g.RastPortPtr;
  213.                     VP: g.ViewPortPtr;
  214.                     Rect: g.RectanglePtr;
  215.                     CompressIt: BOOLEAN): BOOLEAN;
  216.  
  217. Speichert wie WriteILBMScreen ein IFF-File.
  218.  
  219. Name, Rect, CompressIt und der RETURN-Wert entsprechen WriteILBMScreen.
  220.  
  221. RP zeigt auf den RastPort, der die Grafikdaten enthält.
  222.  
  223. VP zeigt auf den ViewPort. der die Farben und ViewModes etc. enthält.
  224.  
  225. Mit WriteILBM kann folgendermaßen ein Fenster gespeichert werden (das Fenster
  226. muß vor allen anderen Fenstern liegen):
  227.  
  228.  
  229. VAR
  230.   Window: Intuition.WindowPtr;
  231.   Rect: Graphics.Rectangle;
  232.   OK: BOOLEAN;
  233.  
  234.   ...
  235.  
  236.   WITH Window^ DO
  237.     WITH Rect DO
  238.       minX := leftEdge;
  239.       minY := topEdge;
  240.       maxX := minX + width - 1;
  241.       maxY := minY + height - 1;
  242.     END;
  243.     Error := WriteILBM(Name,rPort,ADR(wScreen^.viewPort),ADR(Rect),TRUE);
  244.   END;
  245.  
  246.  
  247. ------
  248.  
  249.  
  250. PROCEDURE InitIFFInfo(Info: IFFInfoTypePtr;
  251.                       RP: g.RastPortPtr;
  252.                       VP: g.ViewPortPtr;
  253.                   VAR Rect: g.RectanglePtr);
  254.  
  255. PROCEDURE WriteILBMAll(Name: ARRAY OF CHAR;
  256.                        Info: IFFInfoTypePtr;
  257.                        BM: g.BitMapPtr;
  258.                        FirstLine, LeftOffset: INTEGER;
  259.                        CompressIt: BOOLEAN): BOOLEAN;
  260.  
  261.  
  262. WriteILBMAll kann auch Bilder mit Zusatzinformationen wie ColorCycling etc.
  263. speichern. Dazu wird die Addresse einer initialiesierten IFFInfoType-
  264. Variablen benötigt. Um die Initialisierung zu erleichtern, kann die
  265. Prozedur InitIFFInfo() aufgerufen werden. Ihre Parameter entsprechen denen
  266. von WriteILBM. Danach sind die Unterrecords BMDH, CMAP und CAMG
  267. initialisiert und deren Flags in Info^.IFFTitle gesetzt. Weitere
  268. Unterrecords können dann `von Hand' initialisiert und deren Flags gesetzt
  269. werden.
  270.  
  271. BM zeigt auf die BitMap, die die zu speichernden Planes enthält. BM kann
  272. auch extra zum Speichern initialisiert werden, wenn man z.B. eine
  273. zusätzliche MaskPlane speichern möchte.
  274.  
  275. FirstLine und LeftOffset entsprechen Rect^.minY und Rect^.minX.
  276.  
  277. CompressIt und der RETURN-Wert entsprechen WriteILBMScreen.
  278.  
  279.  
  280. --------------------------  Demonstartionen:  ----------------------------
  281.  
  282.  
  283. ------  ShowIFF:  ------
  284.  
  285.  
  286. Das Programm ShowIFF lädt und zeigt ein IFF-Bild. Es lädt das vorher auf
  287. der Workbench angeklickte oder, beim Starten vom CLI, das hinter dem Namen
  288. angegebene Bild. Bilder, die ShowIFF als Default-Tool haben (Info), können
  289. durch einfachen Doppelklick angezeigt werden. An diesem kurzen Programm
  290. kann man leicht die Verwendung der Ladeprozedur studieren.
  291.  
  292.  
  293. ------  ShowCycle:  ------
  294.  
  295.  
  296. Entspricht ShowIFF für Colorcycling-Bilder. Normallerweise kann es auch für
  297. nicht-Cycling Bilder verwendet werden, wenn die Cyclinginformationen korrekt
  298. ausgeschaltet sind.
  299.  
  300.  
  301. ----------------------------  Copyright:  -----------------------------------
  302.  
  303.  
  304. Das Modul kann von jedem in nicht kommerziell genutzten Programmen frei
  305. verwendet werden.
  306.  
  307. Bevor ein Programm, das dieses Modul benutzt, kommerziell genutzt oder
  308. vertrieben wird, muß sich der Autor mit mir in Verbindung setzten und eine
  309. eventuelle Vergütung aushandeln.
  310.  
  311. ---  Fridtjof.
  312.  
  313. -----------------------------------------------------------------------------
  314.